import {defineStore} from "pinia";
import {ref} from "vue";
import { getRoutesByRoleId, getUserByRoleId, getUserList} from "@/module-base/api/sysManage.js";

export const useRoleStore = defineStore('role', () => {
    const roleModalVisible = ref(false) // 角色修改模态框是否显示
    let roleInfoForm = ref({})  // 角色修改模态框表单数据
    const userToRoleModalVisible = ref(false) // 角色添加用户模态框是否显示
    const userList = ref([])    // 所有的用户列表
    // const userListByRoleKeys=ref([]) // 角色添加用户模态框中,已选用户列表的key集合
    const transferData = ref([])  //角色添加用户模态框中，穿梭框所有的数据，根据用户列表获取
    const targetKeys = ref([])    // 角色添加用户模态框中，已选用户列表的key集合
    const modalRoleId= ref('')    //当前角色id
    const routeData=  ref([])   //当前角色对应的路由数据
    /**
     * 打开角色编辑模态框并初始化表单数据
     *
     * 该函数用于处理角色编辑场景，主要完成两个操作：
     * 1. 将传入的角色数据填充到表单中
     * 2. 控制角色编辑模态框的显示状态
     *
     * @param {Object} role - 需要编辑的角色对象，包含角色ID、名称、权限等属性
     * @returns {void} 本函数不返回任何值
     */
    async function openRoleEditModal(role) {
        // 维护角色基础信息
        setInfoForm(role)
        // 维护角色对应的权限信息
        // 根据角色id，获取全部权限列表，并在列表中标记该角色的权限
        const routes=await getRoutesByRoleId(role?.id)
        // 提取meta.title到顶层
        routeData.value=_transformMetaToTitle(routes.data)
        // if (role?.id) {
        //     debugger
        //
        // }else{
        //     // routeData.value=routes.data
        // }
        roleModalVisible.value = true;
    }
    // 将meta.title属性从meta对象中提取出来，并作为顶层属性。
    function _transformMetaToTitle(data) {
        if (Array.isArray(data)) {
            return data.map(item => _transformMetaToTitle(item)); // 数组遍历处理
        }
        if (typeof data !== 'object' || data === null) return data;

        // 提取meta.title到顶层
        if (data.meta?.title) {
            data.title = data.meta.title;
        }

        // 递归处理子节点（假设子节点在children属性中）
        if (Array.isArray(data.children)) {
            data.children.forEach(child => _transformMetaToTitle(child));
        }

        return data;
    }

    /**
     * 关闭角色编辑模态框
     * 完成操作：
     * 1. 重置表单数据为空对象
     * 2. 控制角色编辑模态框的显示状态*/
    function closeRoleEditModal() {
        roleInfoForm.value = {}
        roleModalVisible.value = false;
    }

    /**
     * 设置表单数据
     * @param {Object} role - 需要编辑的角色对象，包含角色ID、名称、权限等属性
     * */
    function setInfoForm(role) {
        if (!role) {
            roleInfoForm.value = {}
            return
        }
        const initInfoForm = {
            id: '',
            roleName: '',
            description: '',
        }
        // 为this.userInfoForm赋值
        Object.keys(initInfoForm).forEach(key => {
            if (role.hasOwnProperty(key)) {
                roleInfoForm.value[key] = role[key]
            }
        })
    }

    /**
     *打开为角色分配用户的模态框 */
    async function openUserToRoleModal(row) {
        modalRoleId.value=row.id
        // 获取所有用户列表
        const [userListRs, userListByRoleRs] = await Promise.all([getUserList(), getUserByRoleId(row.id)])
        if (userListRs.success) {
            // debugger
            transferData.value = userListRs.data.map((user) => ({
                key: user.id,
                label: user.userCode
            }))
        }
        if (userListByRoleRs.success) {
            targetKeys.value = userListByRoleRs.data.map((user)=>user.id)
        }
        userToRoleModalVisible.value = true;
    }

    /**
     * 关闭为角色分配用户的模态框*/
    function closeUserToRoleModal() {
        userToRoleModalVisible.value = false;
    }

    return {
        roleModalVisible,
        roleInfoForm,
        userToRoleModalVisible,
        transferData,
        targetKeys,
        routeData,
        openRoleEditModal,
        closeRoleEditModal,
        openUserToRoleModal,
        closeUserToRoleModal,
        modalRoleId
    }
})